/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.saber.certificacao.ejbs.stateless.interfaces;

import br.com.saber.certificacao.enums.Papeis;
import br.com.saber.certificacao.modelos.Roles;
import br.com.saber.certificacao.modelos.Usuario;
import java.util.Set;
import javax.ejb.Local;

/**
 *
 * @author gbvbahia
 */
@Local
public interface UsuarioBeanLocal {
      /**
     * Salva usuarios com ID nulo
     * Ou atualiza usuarios com ID definidos.
     * @param usuario
     * @param urlFinanceiro
     */
    void salvarUsuario(Usuario usuario, String urlFinanceiro);

    /**
     * Buscar o usuário com o login informado.
     * @param login
     * @return O usuário proprietário do login ou nulo se não encontrar.
     */
    Usuario buscarUsuarioLogin(String login);

    /**
     * Passe a senha que deseja criptografar e os papeis que o usuário,
     * dono da senha passada, possui.
     * @param senha
     * @param roles
     * @return A senha criptografada.
     */
    String criptografarSenha(String senha, Set<Roles> roles);

    /**
     * Bucar usuário proprietário do e-mail.
     * @param email
     * @return Usuário proprietário do Login ou nulo se não encontrar.
     */
    Usuario buscarUsuarioEmail(String email);

    /**
     * Retorna todos os usuarios, se o usuário passado for administrador
     * Retorna todos os usuários com o papel abaixo do usuário passado, se o usuário passado
     * não for um administrador.
     * @param usuario
     * @return
     */
    Set<Usuario> buscarUsuariosAbaixoPapel(Usuario usuario);

    /**
     * Buscar o usuário correspondente ao ID informado.
     * @param id
     * @return Usuário correspondente ou nulo se não encontrar
     */
    Usuario buscarUsuarioId(Long id);

    /**
     * Retorna todos os usuários que estão dentro do papel passado,
     * quanto mais baixo for o papel maior a qantidade de usuários.
     * Nesta aplicação um papel de maior hierarquia é considerado
     * como de menor hierarquia também, ou seja:
     * Um professor é um aluno, um coordenador é um professor...
     * Se você passar um aluno como parámetro serão retornados
     * todos os alunos, professores, coordenadores...
     * @param papeis
     * @return Um set com todos os usuários correspondentes ou um set vazio se não encontrar.
     */
    Set<Usuario> buscarUsuariosPapel(Papeis papeis);

    /**
     * Incrementa o acesso do usuário não altera outras propriedades,
     * não utilize para atualizar outras informações.
     * @param usuario 
     */
    void incrementarAcesso(Usuario usuario);

     /**
     * Retorna somente usuário que possuem a MaxRole com papel 
     * igual a role passada.
     * @param papel
     * @return 
     */
    Set<Usuario> buscarUsuariosLimitadoAoPapel(Papeis papel);
}
